package com.atguigu.tingshu.search.runners;

import com.atguigu.tingshu.search.service.impl.ItemServiceImpl;
import org.redisson.api.RBloomFilter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Set;

//@Component 暂时不用
public class BloomFilterRunners implements ApplicationRunner, CommandLineRunner, ApplicationContextAware {

    private ApplicationContext applicationContext;

    Logger logger = LoggerFactory.getLogger(this.getClass());


    /**
     * 此方法会在Spring容器启动完毕后执行，一般用于执行一些初始化操作
     *
     * @param args 回调时候的参数 里面有JVM启动参数 --server.port=8020 output=D:// 等
     *             其中--是可选参数（有默认值） 不加--是必选参数（不写就报错）
     *             也就是此方法可以用于检测参数是否正确 做校验
     * @throws Exception
     */
    // todo 这个方法是先执行的 对比CommandLineRunner ApplicationRunner的优先级更高,可见SpringApplication.run()源码
    @Override
    public void run(ApplicationArguments args) throws Exception {
//        Set<String> optionNames = args.getOptionNames();
//        for (String optionName : optionNames) {
//            List<String> optionValues = args.getOptionValues(optionName);
//            System.out.println("命令行的可选参数" + optionName + "=" + optionValues);
//        }
//        List<String> nonOptionArgs = args.getNonOptionArgs();
//        for (String nonOptionArg : nonOptionArgs) {
//            System.out.println("命令行的必选参数" + nonOptionArg);
//        }
//        RBloomFilter bloomFilter = applicationContext.getBean("bloomFilter", RBloomFilter.class);
//        ItemServiceImpl itemServiceImpl = applicationContext.getBean("itemServiceImpl", ItemServiceImpl.class);
//        List<Long> allAlbumId = itemServiceImpl.findAllAlbumId();
//        allAlbumId.forEach(bloomFilter::add);
//        logger.info("布隆过滤器中元素添加完毕，个数{}", bloomFilter.count());
    }

    /**
     * 命令行参数的回调方法
     *
     * @param args incoming main method arguments
     * @throws Exception
     */
    @Override
    public void run(String... args) throws Exception {

    }

    /**
     * @param applicationContext 拿到整个spring的容器
     * @throws BeansException
     */
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
}
